/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package kitaplaner.application;

import java.sql.Connection;
import java.sql.Date;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Locale;
import javax.swing.table.DefaultTableModel;
import kitaplaner.database.Database;
import kitaplaner.database.Gruppe;
import kitaplaner.database.Kita;
import kitaplaner.database.Mitarbeiter;
import kitaplaner.database.TagesStd;

/**
 *
 * @author kristina
 */
public class TagesStdApp {
    private Kita kita;
    private Connection conn;
    private ArrayList <TagesStd> tage;
    Database db = new Database();
    private double gesStd;
    private double gesUStd;

    public TagesStdApp(Kita kita, Connection conn)
    {
        this.conn = conn;
        this.kita = kita;
        tage = kita.getArbStd();
    }

    
    public DefaultTableModel createWochenstundenÜbersicherByGroup(String gruppenName, int kalenderWoche)
    {
        String[] columnNames = {"Mitarbeiter","Montag","Dienstag","Mittwoch","Donnerstag","Freitag"};

        ArrayList<TagesStd> wochenArbeitsStunden = new ArrayList();
        // Get calendar, clear it and set week number and year.
        Calendar calendar = Calendar.getInstance(Locale.GERMANY);

        conn = db.checkConnection(conn);
        MitarbeiterApp maApp = new MitarbeiterApp(kita, conn);
        ArrayList <Mitarbeiter> maList = null;
        DefaultTableModel model = new DefaultTableModel();
        conn = db.checkConnection(conn);
        GruppenApp grpApp = new GruppenApp(this.kita, conn);
        ArrayList <Gruppe> alGrp = new ArrayList <Gruppe>();
        
        
        // hole mitarbeiter nach gruppenID
        maList = maApp.getMitarbeiterByGroup(grpApp.getGrpIdByName(gruppenName));

        //insert Columns
        for (int i = 0 ; i < columnNames.length; i++)
        {
            model.addColumn(columnNames[i]);
        }    

        // Durchlaufe alle Mitarbeiter - Zeilen
        for (int i = 0; i < maList.size(); i++) {
            wochenArbeitsStunden = this.getWeekStdByDate(kalenderWoche, maList.get(i).getId());
            Object[] obj = new Object[columnNames.length];
            
            // Erste Zeile - Vorname des Mitarbeiters
            obj[0] = maList.get(i).getVorname();
            
            // Durchlaufe alle Wochentage - Spalten
            for (int j = 0; j < wochenArbeitsStunden.size(); j++)
            {
                calendar.setTime(wochenArbeitsStunden.get(j).getDate());
                int day = calendar.get(Calendar.DAY_OF_WEEK);
                // 1 is Sunday, 6 is friday
                switch (day) {
                    case 2:
                        obj[1] = wochenArbeitsStunden.get(j).getStdIst();
                        break;
                    case 3:
                        obj[2] = wochenArbeitsStunden.get(j).getStdIst();
                        break;
                    case 4:
                        obj[3] = wochenArbeitsStunden.get(j).getStdIst();
                        break;
                    case 5:
                        obj[4] = wochenArbeitsStunden.get(j).getStdIst();
                        break;
                    case 6:
                        obj[5] = wochenArbeitsStunden.get(j).getStdIst();
                        break;
                    default:
                        System.err.println("Fehler:" + this.getClass());
                }
            }
            model.insertRow(model.getRowCount(), obj);
        }

            

        return model;
    }

    public DefaultTableModel createWochenstundenÜbersicherByMA(Mitarbeiter ma, int kalenderWoche)
    {
        int weDays = 5;
        Calendar cal = new GregorianCalendar();
        String[] columnNames = {"Wochentag", "Datum", "Stunden Anzahl", "Überstunden Anzahl"};
        Object[] obj = new Object[columnNames.length];
        ArrayList<TagesStd> stunden = this.getWeekStdByDate(kalenderWoche, ma.getId());
        System.out.println(stunden.size() + " " + kalenderWoche);
        DefaultTableModel model = new DefaultTableModel();
        TagesStd [] stdSort = {null, null, null, null, null};
        String [] wochentage = {"Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag"};

        double wochenstd = ma.getStdWocheSoll();
        double daystd = wochenstd / weDays;

        gesUStd = 0;
        gesStd = 0;

        //insert Columns
        for (int i = 0 ; i < columnNames.length; i++)
        {
            model.addColumn(columnNames[i]);
        }

        // Durchlaufe alle Wochenstunden des Mitarbeiters
        for (int i = 0 ; i < stunden.size() ; i ++)
        {
            cal.setTime(stunden.get(i).getDate());
            // hohlt den Tag der Woche 1 - 7
            int day = cal.get(Calendar.DAY_OF_WEEK);

            // sonntag = 1, freitag = 6 !TODO, Calendar.MONDAY
            switch (day)
            {
                case 2: stdSort[0] = stunden.get(i); break;
                case 3: stdSort[1] = stunden.get(i); break;
                case 4: stdSort[2] = stunden.get(i); break;
                case 5: stdSort[3] = stunden.get(i); break;
                case 6: stdSort[4] = stunden.get(i); break;
                default: break;
            }
            double std = stunden.get(i).getStdIst();
            gesStd += std;
            gesUStd += (std - daystd);
        }
        DecimalFormat df = new DecimalFormat("#0.00");
        for (int i = 0; i < weDays; i++)
        {
            obj[0] = wochentage[i];
            if (stdSort[i] != null)
            {
                obj[1] = stdSort[i].getDate();
                obj[2] = df.format(stdSort[i].getStdIst());
                obj[3] = df.format(stdSort[i].getStdIst() - daystd);
            }
            else
            {
                obj[1] = "noch kein Stunden Eintrag";
                obj[2] = "noch kein Stunden Eintrag";
                obj[3] = "noch kein Stunden Eintrag";
            }
            model.insertRow(model.getRowCount(), obj);
        }

        return model;
    }

    public TagesStd getTagesStdByDateMa(int maID, Date date)
    {
        TagesStd tag = new TagesStd();

        for (int i = 0; i < tage.size(); i++)
        {
            if (tage.get(i).getDate().getYear() == date.getYear()
             && tage.get(i).getDate().getMonth() == date.getMonth()
             && tage.get(i).getDate().getDate() == date.getDate()
             && tage.get(i).getMaId() == maID)
            {
                tag = tage.get(i);
            }
        }
        
        return tag;
    }

    public Boolean existTagesStdByMaDate(Date date, int maID)
    {
        Boolean exist = false;

        for (int i = 0; i < tage.size(); i++)
        {
            if (tage.get(i).getDate().getYear() == date.getYear()
             && tage.get(i).getDate().getMonth() == date.getMonth()
             && tage.get(i).getDate().getDate() == date.getDate()
             && tage.get(i).getMaId() == maID)
            {
                exist = true;
            }
        }

        return exist;
    }

    public ArrayList<TagesStd> getTagesStdByDate(Date date)
    {
        ArrayList tageDate = new ArrayList<TagesStd>();

        for (int i = 0; i < tage.size(); i++)
        {
            if (tage.get(i).getDate() == date)
            {
                tageDate.add(tage.get(i));
            }
        }
        
        return tage;
    }

    public ArrayList<TagesStd> getWeekStdByDate(Date date, int maID)
    {
        ArrayList tageDate = new ArrayList<TagesStd>();
        Calendar cal = new GregorianCalendar();
        cal.setTime(date);

        int cal_we = cal.get(Calendar.WEEK_OF_YEAR);

        // 2 - 6 Montag bis Fraitag
        // Datum auf 2-day Tage zuvor setzten

        for (int i = 0; i < tage.size(); i++)
        {
            if (tage.get(i).getWeek() == cal_we
             && tage.get(i).getMaId() == maID)
            {
                tageDate.add(tage.get(i));
            }
        }

        return tage;
    }

    public ArrayList<TagesStd> getWeekStdByDate(int week, int maID)
    {
        ArrayList tageDate = new ArrayList<TagesStd>();

        for (int i = 0; i < tage.size(); i++)
        {
            if (tage.get(i).getWeek() == week
             && tage.get(i).getMaId() == maID)
            {
                tageDate.add(tage.get(i));
            }
        }

        return tageDate;
    }

    public Boolean changeStdTag(TagesStd tagStd) {
        Boolean success = false;
        conn = db.checkConnection(conn);
        success = db.changeArbeitsStd(conn, tagStd);
        return success;
    }

    public Boolean insertTagStd(TagesStd tagStd) {
        Boolean success = false;
        conn = db.checkConnection(conn);
        success = db.insertArbeitsStd(conn, tagStd);
        kita.setArbStd(db.getTagesStd(conn));
        tage = kita.getArbStd();
        return success;
        
    }
    
    public String getGesStd() {
        DecimalFormat df = new DecimalFormat("#0.00");
        return (df.format(gesStd));
    }
    public String getGesUStd() {
        DecimalFormat df = new DecimalFormat("#0.00");
        return df.format(gesUStd);
    }
}
